package pe.edu.unmsm.ocaa.workspace.negocio.servicio.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import pe.edu.unmsm.ocaa.workspace.integracion.dao.ArchivoDAO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.ArchivoDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.BDArchivoDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.modelo.dto.GrupoDTO;
import pe.edu.unmsm.ocaa.workspace.negocio.servicio.ArchivoService;

@Service
public class ArchivoServiceImpl implements ArchivoService {

	List<ArchivoDTO> listArchivos;
	@Resource
	ArchivoDAO archivoDao;
	
	@Override
	public TreeNode cargarCarpetas(Integer idUsuario) throws DataAccessException {
		Integer idPadre=0;
		listArchivos=archivoDao.cargarCarpetas(idUsuario);
		TreeNode raiz=new DefaultTreeNode(null, null);
		raiz=cargarArchivosxPadre(idPadre, raiz);
		return raiz;
	}
	
	private TreeNode cargarArchivosxPadre(Integer idPadre, TreeNode padre) {
		for (ArchivoDTO archivo : listArchivos) {
			if(archivo.getIdArchivoPadre().equals(idPadre))
				{
				TreeNode archivoTree=new DefaultTreeNode(archivo, padre);
				cargarArchivosxPadre(archivo.getIdArchivo(), archivoTree);
				}
		}
		return padre;
	}

	@Override
	public void guardarCarpeta(ArchivoDTO carpetaEditar)
			throws DataAccessException {
		carpetaEditar.setTipoArchivo(1);
		if (carpetaEditar.getIdArchivo()==null)
		{
			archivoDao.insertArchivo(carpetaEditar);
			ArchivoDTO carpeta=archivoDao.obtenerUltimaCarpeta();
			carpeta.setNombreArchivoDisco(carpeta.getIdArchivo()+"");
			archivoDao.updateArchivo(carpeta);
			GrupoDTO grup=new GrupoDTO();
			grup.setIdGrupo(9);
			guardarPermisoxCarpeta(grup, carpeta);
		}
		else
			archivoDao.updateArchivo(carpetaEditar);
			
	}

	@Override
	public List<ArchivoDTO> cargarArchivosxCarpeta(Integer idArchivo, Integer idUsuario)
			throws DataAccessException {
		List<ArchivoDTO> listArchivos2=new ArrayList<ArchivoDTO>();
		List<BDArchivoDTO> listBDArchivos=archivoDao.listArchivosxCarpetas(idArchivo, idUsuario);
		Integer idArchivoTemp=0;
		for (BDArchivoDTO bdArchivoDTO : listBDArchivos) {
			if(!bdArchivoDTO.getIdArchivo().equals(idArchivoTemp))
			{
				ArchivoDTO archivo=new ArchivoDTO();
				archivo.setIdArchivo(bdArchivoDTO.getIdArchivo());
				archivo.setIdArchivoPadre(bdArchivoDTO.getIdArchivoPadre());
				archivo.setNombreArchivoDisco(bdArchivoDTO.getNombreArchivoDisco());
				archivo.setNombreArchivoVirtual(bdArchivoDTO.getNombreArchivoVirtual());
				archivo.setTipoArchivo(bdArchivoDTO.getTipoArchivo());
				
				GrupoDTO grupo=new GrupoDTO();
				grupo.setIdGrupo(bdArchivoDTO.getIdGrupo());
				grupo.setNomGrupo(bdArchivoDTO.getNomGrupo());
				archivo.setGrupos(new ArrayList<GrupoDTO>());
				archivo.getGrupos().add(grupo);
				listArchivos2.add(archivo);
				idArchivoTemp=bdArchivoDTO.getIdArchivo();
			}
			else
			{
				GrupoDTO grupo=new GrupoDTO();
				grupo.setIdGrupo(bdArchivoDTO.getIdGrupo());
				grupo.setNomGrupo(bdArchivoDTO.getNomGrupo());
				listArchivos2.get(listArchivos2.size()-1).getGrupos().add(grupo);
			}
		}
		return listArchivos2;
	}

	@Override
	public void guardarArchivo(ArchivoDTO archivoSubidoDTO)
			throws DataAccessException {
		archivoSubidoDTO.setTipoArchivo(2);
		if (archivoSubidoDTO.getIdArchivo()==null)
		{
			archivoDao.insertArchivo(archivoSubidoDTO);
			Integer idArchivo=archivoDao.selectSgteidArchivo()-1;
			GrupoDTO grup=new GrupoDTO();
			grup.setIdGrupo(9);
			archivoSubidoDTO.setIdArchivo(idArchivo);
			guardarPermisoxCarpeta(grup, archivoSubidoDTO);
			
		}
		else
			archivoDao.updateArchivo(archivoSubidoDTO);		
	}

	@Override
	public boolean existeArchivoenCarpeta(String nombreArchivo, Integer idCarpeta)
			throws DataAccessException {
		boolean existe=false;
		List<ArchivoDTO> list=archivoDao.selectArchivoEnCarpeta(nombreArchivo, idCarpeta);
		if (list.size()>0)
			return true;
		else
			return false;
	}

	@Override
	public String generarSgteNomArchivoDisco(String nombreArchivo)
			throws DataAccessException {
		int iniTipArchivo= nombreArchivo.lastIndexOf(".");
		Integer sgteNombre=archivoDao.selectSgteidArchivo();
		String nuevoNombre=sgteNombre+nombreArchivo.substring(iniTipArchivo, nombreArchivo.length());
		System.out.println("nuevo nombre "+nuevoNombre);
		return nuevoNombre;
	}

	@Override
	public boolean esArchivo(ArchivoDTO archivoSeleccionado)
			throws DataAccessException {
		boolean existe=false;
		if (archivoDao.selectCountArchivo(archivoSeleccionado.getIdArchivo())>0)
			existe=true;			
		return existe;
	}

	@Override
	public void eliminarArchivo(Integer idArchivo) throws DataAccessException {
		List<ArchivoDTO> listsubArchivos=cargarArchivosxCarpeta(idArchivo, 1);
		ArchivoDTO archivo=archivoDao.selectArchivo(idArchivo);
		for (ArchivoDTO archivoDTO : listsubArchivos)
			eliminarArchivo(archivoDTO.getIdArchivo());
		File file = new File("C:\\ocaa\\" + archivo.getNombreArchivoDisco());
		file.delete();
		archivoDao.deletePermisosxArchivo(idArchivo);
		archivoDao.deleteArchivo(idArchivo);
	}
	
	@Override
	public void guardarPermisoxCarpeta(GrupoDTO grupoCompartir,
			ArchivoDTO archivo) throws DataAccessException {
		Map map=new HashMap();
		map.put("idGrupo", grupoCompartir.getIdGrupo());
		map.put("idArchivo", archivo.getIdArchivo());
		map.put("idPermiso", 1);
		archivoDao.insertPermisoCarpeta(map);
	}

	@Override
	public void eliminarGrupoxArchivo(Integer idGrupo,
			ArchivoDTO archivoSeleccionado) throws DataAccessException {
		archivoDao.deleteGrupoxArchivo(idGrupo, archivoSeleccionado.getIdArchivo());
	}

}
